package org.ellisande.tld;

@org.ellisande.tld.annotations.Tag
public class TLDGen {
//	List<Class<?>> tagClasses;
//
//	public TLDGen() {
//		this.tagClasses = getTagClasses();
//	}
//
//	public static void main(String[] args) throws Throwable {
//		XStream xstream = new XStream(new StaxDriver());
//		xstream.autodetectAnnotations(true);
//		
//		TLDGen gen = new TLDGen();
//		Taglib taglib = new Taglib(gen.parseTags());
//		String xml = xstream.toXML(taglib);
//		
//		File file = new File("src/main/resources/META-INF/grid_tags.tld");
//		FileWriter fw = new FileWriter(file);
//		fw.write(xml);
//		fw.close();
//	}
//
//	public List<Tag> parseTags() {
//		final List<Tag> tags = new ArrayList<Tag>();
//		for (Class<?> clazz : tagClasses) {
//			if (!clazz.isAnnotationPresent(org.ellisande.tld.annotations.Tag.class)) {
//				continue;
//			}
//			final Tag tag = new Tag();
//			String tagName = clazz.getSimpleName();
//			tagName = tagName.replace("Tag", "");
//			tagName = WordUtils.uncapitalize(tagName);
//
//			tag.setName(tagName);
//			tag.setTagClass(clazz);
//			tag.setBodyContent(clazz.getAnnotation(org.ellisande.tld.annotations.Tag.class).bodyContent().toString());
//			if(clazz.isAnnotationPresent(Info.class)){
//			tag.setInfo(clazz.getAnnotation(Info.class).value());
//			}
//			
//			List<Attribute> attributes = new ArrayList<Attribute>();
//			getAttributes(clazz, attributes);
//			tag.setAttributes(attributes);
//			tags.add(tag);
//		}
//		return tags;
//	}
//
//	private void getAttributes(Class<?> clazz, List<Attribute> attributes) {
//		if(clazz.equals(Object.class) || clazz.equals(TagSupport.class)){
//			return;
//		}
//		Field[] fields = clazz.getDeclaredFields();
//		for (Field field : fields) {
//			if (field.isAnnotationPresent(org.ellisande.tld.annotations.Attribute.class)) {
//				final Attribute attribute = new Attribute();
//				attribute.setName(field.getName());
//
//				if (field.isAnnotationPresent(Description.class)) {
//					Description description = field.getAnnotation(Description.class);
//					attribute.setDescription(description.value());
//				}
//				if (field.isAnnotationPresent(EvaluateExpressions.class)) {
//					attribute.setEvaluateExpressions(true);
//				}
//				if (field.isAnnotationPresent(Required.class)) {
//					attribute.setRequired(true);
//				}
//
//				attributes.add(attribute);
//			}
//		}
//		
//		getAttributes(clazz.getSuperclass(), attributes);
//	}
//	
//
//	private List<Class<?>> getTagClasses() {
//		List<Class<?>> tagClasses = new ArrayList<Class<?>>();
//		tagClasses.add(RowTag.class);
//		tagClasses.add(CellTag.class);
//		tagClasses.add(ButtonGroupTag.class);
//		tagClasses.add(ButtonTag.class);
//		tagClasses.add(DropdownButtonTag.class);
//		tagClasses.add(LeaderboardTag.class);
//		tagClasses.add(NavListItemTag.class);
//		tagClasses.add(NavListTag.class);
//		tagClasses.add(ListDropdownTag.class);
//		tagClasses.add(ContainerTag.class);
//		return tagClasses;
//	}
}
